/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include "OscilloscopeData.h"

#include "SimInterface/ISimulator.h"
#include "UI/SimulatorSettings.h"

namespace Ui {
    class MainWindow;
}

class SimulatorSettings;

/**
    Klasa głównego okna z wykresami.
*/
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    static const unsigned DEFAULT_PLOT_BUFFER_SIZE;
    static const QwtPlotCurve::CurveStyle DEFAULT_STYLE;

    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    //void attachSimulator(RafMat::SimInterface::ISimulator isim);

    /**
        Uruchamia timer z symulacją.
    */
    void startSimTimer();

    /**
        Wstrzymuje timer z symulacją.
    */
    void stopSimTimer();

    /**
        Wykonuje jeden cykl timera z symulacją.
    */
    void stepSimTimer();

    /**
        Wykonuje n cykli symulacji za jednym zamachem.
    */
    void stepSimTimer(unsigned stepSize);

    /**
        Zmiana szybkości symulacji

        \param [in] interval Okres pomiędzy kolejnymi cyklami
        symulacji (w milisekundach).
    */
    void changeSimTiming(int interval);

    /**
        Czyści wszystkie wykresy.
    */
    void resetView();

    /**
        Zmienia styl wykresów.
    */
    void changePlotStyle(QwtPlotCurve::CurveStyle style);

    /**
        Zmienia liczbę punktów wyświetlanych.
    */
    void changePlotBufferSize(unsigned size);

    void setAntiAliasing(bool antiAliasing);

    void replot();

    void setPlotWidth(double width);

private slots:
    //void on_pushButton_clicked();
    void on_timer();

    void on_actionModel_editor_triggered();

    void on_actionSaveAs_triggered();
    void on_actionSave_triggered();
    void on_actionOpen_triggered();

    void copyPlotToClipboard();
private:
    Ui::MainWindow *ui;

    void initializePlots();
    void initializeTimer();

    void saveSelectFile();
    void saveConfiguration();

    /** Zamyka projekt pytając się o zapis.
        \return False - jeśli wciśnięto Cancel.
    */
    bool releaseConfiguration();

    RafMat::SimInterface::ISimulatorSPtr m_simulator;  ///< Instancja symulatora.
    SimulatorSettings *m_simSettings;                  ///< Okno ustawień symulacji.

    // Krzywe wykresu:
    QwtPlotCurve *m_curveOutput;
    QwtPlotCurve *m_curveInput;
    QwtPlotCurve *m_curveControl;

    // Dane wykresu:
    RafMat::UI::OscilloscopeData *m_inputWaveform;
    RafMat::UI::OscilloscopeData *m_outputWaveform;
    RafMat::UI::OscilloscopeData *m_controlWaveform;

    QPen m_pen1, m_pen2, m_pen3;

    bool m_stepMode;    ///< Tryb symulacji.
    QTimer *m_timer;    ///< Obiekt timera.

    bool m_neverSaved;
    QString m_configurationFile;
};

#endif // MAINWINDOW_H
